//
//  CZUserModel.swift
//  项目框架
//
//  Created by yang on 16/2/27.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit

class CZUserModel: NSObject ,NSCoding{

    /*返回值字段	字段类型	字段说明
    access_token	string	用于调用access_token，接口获取授权后的access token。
    expires_in	string	access_token的生命周期，单位是秒数。
    remind_in	string	access_token的生命周期（该参数即将废弃，开发者请使用expires_in）。
    uid	string	当前授权用户的UID。*/
    var access_token :String?
    
    var expires_in:NSTimeInterval = 0{
    
        didSet{
            //得到过期的时间、
            
            expires_date = NSDate(timeIntervalSinceNow: expires_in)
        }
    }
    
    var uid :String?
    
    //再这个类的基础上添加2个属性
    ///profile_image_url	string	用户头像地址（中图），50×50像素
    var profile_image_url: String?
    ///screen_name	string	用户昵称
    var screen_name: String?
    
    ///   定义一个属性,来记录未来的时间
    var expires_date: NSDate?
    
    
    override init() {
        super.init()
    }
    //KVC构造函数
    init(dict:[String:NSObject]) {
        
        super.init()
        
        setValuesForKeysWithDictionary(dict)
    }
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
    }
    //保存
    //沙盒路径
    func save(file:String){
        
//       let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last
//        //拼接文件路径string转换为nsstring
//        let filePath = (path! as NSString).stringByAppendingPathComponent(file)
//        
//        NSKeyedArchiver.archiveRootObject(self, toFile: filePath)
        //保存
        //沙盒路径 -- 沙盒肯定有路径,所以可以强制解包
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        //拼接文件路径 -- string -> NSString as
        let filePath = (path as NSString).stringByAppendingPathComponent(file)
        
        NSKeyedArchiver.archiveRootObject(self, toFile: filePath)
    
    }
    
    //实例方法必须创建一个对象
    //类方法必须用关键字class
    class func readObject(file:String)->CZUserModel?{
    
        //路径
      let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last
        
        let filePath = (path! as NSString).stringByAppendingPathComponent(file)
    
// 判断有效期限 -- 返回的是一个秒数?  秒数 + 当前的时间 = 未来的时间
/*
如果在有效期内,则返回数据
没有在有效期,返回nil
*/
        //接档数据
        let model = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? CZUserModel
        
        //判断有值则返回数据，空则返回nil
        
        if let date = model?.expires_date{
        
            /*
            
            NSComparisonResult
            case OrderedAscending -- 升序 由小到大
            case OrderedSame      -- 相等
            case OrderedDescending -- 降序 有大到小
            */
            // 未来的时间 大 ,现在的时间小, 没有过期
            // 其他的都算过期
        
            if date.compare(NSDate()) == .OrderedDescending{
                
                return model
            }else{
            
                return nil
            }
            
        }
        return nil
    }

    func readObject(file:String)->CZUserModel?{
    
       let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        
        let filePath = (path as NSString).stringByAppendingPathComponent(file)
        
        return NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? CZUserModel
    }

    //归档和接档
    //归档-》吧对象以二进制的形式存入沙盒
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeObject(expires_date, forKey: "expires_date")
        aCoder.encodeObject(uid, forKey: "uid")
        aCoder.encodeObject(screen_name, forKey: "screen_name")
        aCoder.encodeObject(profile_image_url, forKey: "profile_image_url")

    }
    //接档-》将沙盒中的2进制转换为对象
    required init?(coder aDecoder: NSCoder) {
        self.access_token = aDecoder.decodeObjectForKey("access_token") as? String
        
        self.expires_date = aDecoder.decodeObjectForKey("expires_date") as? NSDate
        
        self.uid  = aDecoder.decodeObjectForKey("uid") as? String
        
        self.screen_name = aDecoder.decodeObjectForKey("screen_name") as? String
        
        self.profile_image_url  = aDecoder.decodeObjectForKey("profile_image_url") as? String
    }
    
}
